<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 1.race 2. all 3.allSettled

        let p1 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(111)
                // reject(111);
            }, 1000);
        })

        let p2 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(222)
                // reject(222);
            }, 3000);
        })

        let p3 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(333)
            }, 2000);
        })
        // // 同时执行 多个异步 promise 返回最后是一个数组对象 , 不是依次执行
        // // 不管是fulfilled或rejected 都返回
        // Promise.allSettled([p1,p2,p3]).then(res=>{
        //     console.log(res);
        // })
        
        




        //寻找那个执行最快的那个,不管成功还是失败,返回一个promise对象
        // Promise.race([p1,p2,p3]).then(res=>{
        //     console.log(res);
        // },err=>{
        //     console.log('error',err);
        // })     



        
        //可以执行多个promise对象,可以收集所有promise对象的结果.
        // 只返回一个数组promise对象resolve正确的值 打印一个数组    
        // Promise.all([p1,p2,p3]).then(res=>{
        //     console.log(res);
        // })





        // Promise.allSettled()静态方法实现过程
        // function MyallSettled(arr){
        //     return new Promise(resolve=>{
        //         let resArr = new Array(arr.length);
        //         let count = 0 ;
        //         arr.forEach((p,key)=>{
        //             p.then(res=>{
        //                 let obj = {};
        //                 obj.status = 'fulfilled';
        //                 obj.value = res;
        //                 resArr[key] = obj;

        //                 count++;
        //                 if(count === arr.length){
        //                     resolve(resArr)
        //                 }
        //             },err=>{
        //                 let obj = {
        //                     status : 'rejected',
        //                     reason : err
        //                 };
        //                 resArr[key] = obj;
        //                 count++;
        //                 if( count === arr.length){
        //                     resolve(resArr)
        //                 }
        //             })
        //         })
        //     })
        // }
        // MyallSettled([p1,p2,p3]).then(res=>{
        //     console.log(res);
        // })



        // Promise.race()静态方法实现
        // function MyRace(arr){
        //     return new Promise((resolve , reject)=>{
        //         arr.forEach(p=>{
        //             p.then(res=>{
        //                 resolve(res);
        //             },err=>{
        //                 reject(err);
        //             })
        //         })
        //     })
        // }

        // MyRace([p1,p2,p3]).then(res=>{
        //     console.log(res);
        // },err=>{
        //     console.log(err);
        // })

        



        //Promise.all()静态方法实现
        function MyAll(arr){
            return  new Promise(resolve=>{
                let count = 0;
                let resArr = [];
                arr.forEach(p=>{
                    p.then(res=>{
                        resArr.push(res);
                        count++;
                        if(count >= arr.length){
                            resolve(resArr);
                        }
                    })
                })
            })
        }
        MyAll([p1,p2,p3]).then(res=>{
            console.log('外部打印',res);
        })




    </script>
</body>
</html>